package factory.simplefactory;

/**
 * @auther: Steven
 * @created： 2018/2/9 17:56
 * Description：工厂模式测试类
 */
public class FactoryModelTest {
    public static void main(String[] args) {
        // 没有工厂时的例子
        //withoutPattern();

        // 简单工厂在创建时好像都是硬编码，调用之前或者传入代号或传入类的class字节码

        // 普通简单工厂
        // simpleFactoryPatternNormal();

        // 反射实现简单工厂
      //  simpleFactoryPatternReflection();

        // 多方法，即不像以上两种方式那样，只通过一个创建方法来创建对象。在工厂中，使用多个方法创建对象。每种对象负责一种对象的创建。
        simpleFactoryPatternMultiFunc();
    }


    /**
     * 不使用工厂 创建各种车
     */
    public static void withoutPattern() {
        System.out.println("-------------不使用工厂----------------");
        // 弄一辆豪华轿车
        Limousine limousine = new Limousine();
        limousine.purposeFeature();

        Trunk trunk = new Trunk("三一重工");
        trunk.purposeFeature();
    }

    /**
     * 使用简单工厂模式生成对象
     */
    public static void simpleFactoryPatternNormal() {
        System.out.println("-------------简单工厂----------------");
        // 用交通工具工厂创建交通工具。通过指定交通工具类型来造出特定的交通工具
        IVehicle trunk = VehicleSimpleFactory.newInstanceVehicle(VehicleSimpleFactory.VEHICLE_TYPE_TRUNK);
        trunk.purposeFeature();
    }

    /**
     * 利用反射实现简单工厂。传入需要实例化的字节码，通过反射获取类名之后创建实例化对象，加载到容器
     */
    public static void simpleFactoryPatternReflection() {
        // 使用反射，在创建对象的时候采用反射出的类名
        System.out.println("-------------反射实现无参数对象的简单工厂----------------");
        IVehicle limousine = VehicleSimpleFactoryReflection.newInstance(Limousine.class);
        limousine.purposeFeature();

        // 不足之处 这种带参数创建对象就完犊子了
        System.out.println("-------------简单工厂创建带参数的对象----------------");
        IVehicle trunk = VehicleSimpleFactory.newInstanceVehicle(VehicleSimpleFactory.VEHICLE_TYPE_TRUNK,"三菱");
        trunk.purposeFeature();
    }

    public static void simpleFactoryPatternMultiFunc(){
        System.out.println("-------------多方法实现简单工厂----------------");
        IVehicle car=VehicleSimpleFactoryMultiFunc.newInstanceCar();
        car.purposeFeature();
        System.out.println("-------感觉跟使用JDK很像----------------");
    }
}
